/**
 * @file user_config.c
 * @brief MIDI 驱动项目用户配置实现
 * @date 2025-11-03
 */

#include "user_config.h"
#include "board.h"
#include <stdint.h>
#include <stdbool.h>
#include <string.h>

/* 全局配置变量定义 -----------------------------------------------------*/

/**
 * @brief 全局用户配置实例
 */
user_config_t user_config;

/* 私有函数原型声明 -----------------------------------------------*/
static bool board_number_valid(uint8_t board_number);

/* 公共函数实现 ---------------------------------------------------------*/

/**
 * @brief 初始化用户配置 (加载默认值)
 */
void user_config_init(void)
{
    memset(&user_config, 0, sizeof(user_config_t));

    /* 板级配置默认值 */
    user_config.board_id = 0;
    user_config.board_id_assigned = false;

    /* MIDI 协议配置默认值 */
#if MIDI2_INTERNAL_16BIT_VEL
    user_config.midi_version = MIDI_VERSION_2_0;
    user_config.velocity_bits = VELOCITY_BITS_16;
    user_config.velocity_max = 65535;
#else
    user_config.midi_version = MIDI_VERSION_1_0;
    user_config.velocity_bits = VELOCITY_BITS_7;
    user_config.velocity_max = 127;
#endif

    /* PWM 精度配置 */
    user_config.pwm_resolution = PWM_HARDWARE_RESOLUTION;
    user_config.pwm_duty_max = PWM_HARDWARE_RESOLUTION;  /* 使用硬件最大精度 */

    /* 时序配置默认值 */
    user_config.time1_ms = CONFIG_TIME1_DURATION_MS;
    user_config.time2_ms = CONFIG_TIME2_DURATION_BASE_MS;
    user_config.time3_1_duty = CONFIG_TIME3_1_DUTY_DEFAULT;
    user_config.time3_2_duty = CONFIG_TIME3_2_DUTY_DEFAULT;
    user_config.time3_1_ms = CONFIG_TIME3_1_DURATION_MS;
    user_config.timeout_ms = CONFIG_KEY_TIMEOUT_MS;

    /* 设定模式默认值 */
    user_config.setup_mode = 0;  /* 0=正常播放模式 */
}

/**
 * @brief 设置板号
 * @param board_number 板号 (1-11)
 * @retval 0 成功，-1 失败
 */
int user_config_set_board_number(uint8_t board_number)
{
    if (!board_number_valid(board_number))
    {
        return -1;
    }

    user_config.board_id = board_number;
    user_config.board_id_assigned = true;

    return 0;
}

/**
 * @brief 获取板号
 * @retval 板号 (1-11)，0表示未分配
 */
uint8_t user_config_get_board_number(void)
{
    return user_config.board_id;
}

/**
 * @brief 检查板号是否已分配
 * @retval true 已分配，false 未分配
 */
bool user_config_is_board_number_assigned(void)
{
    return user_config.board_id_assigned;
}

/**
 * @brief 重置板号状态
 */
void user_config_reset_board_number(void)
{
    user_config.board_id = 0;
    user_config.board_id_assigned = false;
}

/**
 * @brief 设置 MIDI 协议版本
 */
void user_config_set_midi_version(uint8_t version)
{
    if (version == MIDI_VERSION_1_0)
    {
        user_config.midi_version = MIDI_VERSION_1_0;
        user_config.velocity_bits = VELOCITY_BITS_7;
        user_config.velocity_max = 127;
    }
    else if (version == MIDI_VERSION_2_0)
    {
        user_config.midi_version = MIDI_VERSION_2_0;
        user_config.velocity_bits = VELOCITY_BITS_16;
        user_config.velocity_max = 65535;
    }
}

/**
 * @brief 获取 MIDI 协议版本
 */
uint8_t user_config_get_midi_version(void)
{
    return user_config.midi_version;
}

/**
 * @brief 获取当前 velocity 精度
 */
uint8_t user_config_get_velocity_bits(void)
{
    return user_config.velocity_bits;
}

/**
 * @brief 获取当前 velocity 最大值
 */
uint32_t user_config_get_velocity_max(void)
{
    return user_config.velocity_max;
}

/**
 * @brief 获取 PWM 硬件分辨率
 */
uint16_t user_config_get_pwm_resolution(void)
{
    return user_config.pwm_resolution;
}

/* 私有函数实现 ---------------------------------------------------------*/

/**
 * @brief 检查板号是否有效
 * @param board_number 板号
 * @retval true 有效，false 无效
 */
static bool board_number_valid(uint8_t board_number)
{
    return (board_number >= 1 && board_number <= 11);
}

/******************************** 文件结束 *********************************/
